home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 13
/
Aminet 13 - August 1996.iso
/
Aminet
/
comm
/
maxs
/
CMaxGu16.lha
/
CydalMaxGuide16
/
format.a
< prev
next >
Wrap
Text File
|
1996-03-13
|
6KB
|
225 lines
xdef _formatfile
section code
; A0 ^ fil
; A1 ^ dato "00-00-00"
; D0 = Nyflag (BOOL)
_formatfile:
movem.l d2-d7/a2-a6,-(sp)
move.l d0,d6
tst.w SplitInit
bne.b .iniok
not.w SplitInit
lea SplitMap,a2
moveq #0,d0
subq.b #1,d0
.inilp: clr.b (a2)+
dbra d0,.inilp
lea SplitMap,a2
st (a2)
st ' '(a2)
st '.'(a2)
st '/'(a2)
st '!'(a2)
.iniok: lea MyString,a6
move.l #32<<24+32<<16+32<<8+32,d7
; WRITE OUT THE NAME
lea 18(a0),a2 ; a2 ^ name
move.l a2,d0 ; d0 ^ name
.lp: move.b (a2)+,(a6)+ ; copy name
bne.b .lp
move.b d7,-1(a6)
sub.l a2,d0
neg.w d0
sub.w #24,d0 ; this is the actual max length ± a few bytes :-)
bgt.b .toolong
neg.w d0
subq.w #1,d0
blt.b .ok
; TOO SHORT
.lp2: move.b d7,(a6)+
dbra d0,.lp2
bra.b .ok
; TOO LONG
.toolong:
sub.w d0,a6
move.w #'!'<<8+32,-2(a6)
.ok:
move.b d7,(a6)+
; WRITE OUT THE SIZE
move.l #$ffff,d0
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.l 8(a0),d2
lsr.l #8,d2
lsr.l #2,d2
bne.b .not0
moveq #1,d2
.not0: move.b #'K',d1
cmp.l #999,d2
ble.b .ok2
divu #102,d2
ext.l d2
move.b #'M',(a6)+
divu #10,d2
swap d2
add.b #'0',d2
move.b d2,-2(a6)
move.b #'.',-3(a6)
swap d2
add.b #'0',d2
move.b d2,-4(a6)
bra.b .skip
.ok2: move.l a6,a5
move.b d1,(a6)+
Loop: divu #10,d2
swap d2
add.b #'0',d2
move.b d2,-(a5)
swap d2
and.l d0,d2
bne.S Loop
.skip: move.b d7,(a6)+
move.b d7,(a6)+
; WRITE OUT THE DATE
move.b (a1)+,(a6)+
move.b (a1)+,(a6)+
move.b (a1)+,(a6)+
move.b (a1)+,(a6)+
move.b (a1)+,(a6)+
move.b (a1)+,(a6)+
move.b (a1)+,(a6)+
move.b (a1)+,(a6)+
move.b (a1)+,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
tst.b d6
beq.b .old
move.b #'*',-2(a6)
.old:
; WRITE OUT THE DL COUNT
move.l 12(a0),d0
cmp.l #100,d0
blo.b .nocut
moveq #99,d0 ; gee, this BBS is popular.. >100 dl's of this file!!!
.nocut: divu #10,d0
add.l #'0'*$10001,d0
move.b #'[',(a6)+
move.b d0,(a6)+
swap d0
move.b d0,(a6)+
move.b #']',(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
; WRITE OUT THE DESCRIPTION
lea 59(a0),a2
lea SplitMap,a4
moveq #0,d1
.lp4: cmp.b (a2),d7
bne.b .nospacefirst
addq.l #1,a2
bra.b .lp4
.nospacefirst:
moveq #27,d0
sub.l a3,a3
.lp3: move.b (a2)+,d1 ; AT THIS POINT TRY TO FIND A VALID CHAR TO OUTPUT
beq.w .done ; TERMINATE AT NULL CHAR
cmp.b d7,d1 ; SKIP CHARS < ASCII 32
blo.b .lp3
bne.b .no2space
.morespace:
cmp.b (a2),d7 ; SKIP DUPLICATE CHARS <= ASCII 32
bhs.b .lp3
.no2space:
move.b d1,(a6)+
tst.b (a4,d1.w) ; REMEMBER POSITION OF LAST SEPARATOR FOR WORD WRAP
beq.b .nope
move.l a2,a3
move.l a6,a5
.nope: dbra d0,.lp3 ; STOP AT THE MAXIMUM LENGTH OF LINE
; CHECK IF ALL THAT REMAINS IS SEPARATORS, IF SO DON'T LOOP--LOOKS UGLY!
move.l a2,a1
.clp: move.b (a1)+,d1
beq.b .done
tst.b (a4,d1.w)
bne.b .clp
; GO BACK TO LAST SEPARATOR, IF ANY, AND BREAK THE LINE THERE = WORD WRAPPING
cmp.l #0,a3
beq.b .hard
move.l a3,a2
move.l a5,a6
; MAKE NEWLING AND INDENT FOR NEXT LINE
.hard: move.b #10,(a6)+
move.b d7,(a6)+ ; I wonder what SAS meant by not making a REPT directive
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
move.b d7,(a6)+
bra.w .lp4
.done: move.b #10,(a6)+
clr.b (a6)
movem.l (sp)+,d2-d7/a2-a6
move.l #MyString,d0
rts
MyString: ds.b 300
SplitMap: ds.b 256
SplitInit: dc.w 0
end